package controladores;

import gamebook.Comentario;
import gamebook.MensajeGenerico;
import gamebook.Paginacion;
import gamebook.Privado;
import gamebook.Publicacion;
import gamebook.UsuarioGenerico;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class MensajeServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        //Para publicar un mensaje, ya sea una publicacion o un comentario
        try {
            //Cogemos el objeto sesión
            HttpSession sesion = request.getSession();
            //Usuario que maneja el ordenador
            UsuarioGenerico usuario = (UsuarioGenerico) sesion.getAttribute("usuario");
            //Usuario al que pertenece el muro que se está visitando
            UsuarioGenerico usuarioDestino = (UsuarioGenerico) sesion.getAttribute("usuariomuro");
            //Opcion: puede ser publicarPost o publicarComentario
            String opcion = request.getParameter("opcion");
            
            //Ruta para cualquier sendRedirect
            String ruta = getServletContext().getContextPath();
            
            //Para usar el polimorfismo
            MensajeGenerico mensajeGenerico = null;
            
            //Array para los errores
            List<String> errores = new ArrayList<String>();
            
            //Cogemos el número de la página que estamos (GET:pag), si no hay es la primera página
            int pagina = Paginacion.cogePagDeGet(request.getParameter("pag"));
            /*
            if (request.getParameter("pag") != null) {
                try {
                    pagina = Integer.parseInt(request.getParameter("pag")) - 1;
                    if (pagina < 0) {
                        pagina = 0;
                    }
                } catch (NumberFormatException ex) {
                    pagina = 0;
                }
            }
            */
            if(opcion!=null){
                if (opcion.equals("publicarPost")) { //Esto es una publicación
                    //Creamos una publicación y la metemos en mensajeGenerico
                    Publicacion publicacion = new Publicacion();
                    mensajeGenerico = publicacion;
                
                } else if (opcion.equals("publicarComentario")) { //Esto es un comentario

                    //Primero cogemos la publicacion sobre la que vamos a comentar
                    int publicacionId = Integer.parseInt(request.getParameter("publicacion"));
                    MensajeGenerico publicacion = MensajeGenerico.seleccionarPorId(publicacionId);
                    //Creamos un comentario y lo metemos en mensajeGenerico
                    Comentario comentario = new Comentario();
                    //Este campo es própio unicamente de los comentarios
                    comentario.setPublicacion((Publicacion) publicacion);
                    mensajeGenerico = comentario;

                } else if (opcion.equals("publicarPrivado")){
                    String mail = request.getParameter("usuarioDestinoMail");
                    String texto = request.getParameter("texto");
                    if(mail.length()>0){
                        if(texto.length()>0){
                              //Set the email pattern string
                              Pattern p = Pattern.compile(".+@.+\\.[a-z]+");
                              //Match the given string with the pattern
                              Matcher m = p.matcher(mail);
                              //check whether match is found 
                              boolean matchFound = m.matches();
                              if(!matchFound){
                                  errores.add("El campo mail esta mal introducido");
                              }else{
                                  if(mail!=null){ 
                                     //Cogemos el usuarioDestino por su mail(si llegamos aqui desde 
                                     //Mensejeria Privada)
                                     usuarioDestino = UsuarioGenerico.getUsuarioPorMail(mail);
                                     if(usuarioDestino == null){
                                          errores.add("No se ha encontrado al usuario con el mail introducido");
                                      }else if(!usuarioDestino.esAmigo(usuario)){
                                          errores.add("No puede enviar mensajes a desconocidos");
                                      }else{
                                          mensajeGenerico = new Privado();
                                      }
                                  }
                              }
                        }else{
                            errores.add("No ha introducido el mensaje");
                        }
                    }else{
                        errores.add("No ha introducido el mail");
                    }
                }else if (opcion.equals("mensajePrivado")){
                    String destino = request.getParameter("destino");
                    if(destino!=null){
                        if(destino.equals("mensajes.jsp")){
                            response.sendRedirect(ruta+ "/mensajes.jsp?opcion=muestraBandejaEntrada&nuevoPrivado=1");
                        }else if(destino.equals("gente.jsp")){
                            String idUser = request.getParameter("idUser");
                            int id = Integer.parseInt(idUser);
                            usuarioDestino = UsuarioGenerico.getUsuarioPorId(id);
                            response.sendRedirect(ruta+ "/gente.jsp?opcion=irAGente&nuevoPrivado=1&mailUser="+
                                    usuarioDestino.getMail()+"");
                        }
                    }
                }else if (opcion.equals("muestraBandejaEntrada")){
                    
                    Paginacion p = new Paginacion(Privado.PRIVXPAG, Privado.contarPorDestinatario(usuario), pagina);
                    List<MensajeGenerico> mensajeriaEntrada = Privado.seleccionarPorDestinatario(usuario, p.offset(),p.getRegistrosPorPagina());
                    
                    //request.setAttribute("mensajeria", mensajeriaEntrada);
                    //request.getRequestDispatcher("/mensajes.jsp").forward(request, response);
                    request.setAttribute("paginacionMensajeria", p);
                    request.setAttribute("mensajeria", mensajeriaEntrada);
                    
                    request.getRequestDispatcher("/mensajes.jsp").forward(request, response);
                }else if(opcion.equals("muestraBandejaSalida")){
                    Paginacion p = new Paginacion(Privado.PRIVXPAG, Privado.contarPorOrigen(usuario), pagina);
                    List<MensajeGenerico> mensajeriaSalida = Privado.seleccionarPorOrigen(usuario, p.offset(), p.getRegistrosPorPagina());
                    //request.setAttribute("mensajeria", mensajeriaSalida);
                    //request.getRequestDispatcher("/mensajes.jsp").forward(request, response);
                    request.setAttribute("paginacionMensajeria", p);
                    request.setAttribute("mensajeria", mensajeriaSalida);
                    
                    request.getRequestDispatcher("/mensajes.jsp").forward(request, response);
                }else if(opcion.equals("borrarMensajeria")){
                    String[] idMensajes = request.getParameterValues("mensajeria");
                    if(idMensajes!=null){
                        for(int i=0;i<idMensajes.length;i++){
                            MensajeGenerico p = Privado.seleccionarPorId(Integer.parseInt(idMensajes[i]));
                            p.borrar();
                        }
                    }
                    response.sendRedirect(ruta + "/control?opcion=irAMensajes");
                }
                
                
                /* DAR DE ALTA POSTS, COMENTARIOS Y PRIVADOS*/
                if(opcion.equals("publicarPost") || opcion.equals("publicarComentario") || opcion.equals("publicarPrivado")){
                    if (errores.size() > 0) {
                        sesion.setAttribute("erroresMensajeria", errores);
                        String destino = request.getParameter("destino");
                        if(destino != null){
                            if(destino.equals("mensajes.jsp")){
                                response.sendRedirect(ruta + "/control?opcion=mensajePrivado&destino=mensajes.jsp");
                            }else if(destino.equals("gente.jsp")){
                                response.sendRedirect(ruta + "/control?opcion=mensajePrivado&destino=gente.jsp");
                            }
                        }
                    }else{
                        //Ahora todas las cosas comunes a cualquier tipo de mensajeGenerico
                        mensajeGenerico.setContenido(request.getParameter("texto"));
                        mensajeGenerico.setFecha(new Date());
                        mensajeGenerico.setUsuarioDestino(usuarioDestino);
                        mensajeGenerico.setUsuarioOrigen(usuario);

                        if (mensajeGenerico.darAlta()) {//Si todo ha ido bien, vamos al muro redirigiendo
                            if(opcion.equals("publicarPost") || opcion.equals("publicarComentario")){
                                response.sendRedirect(ruta + "/muro.jsp");
                            }else if(opcion.equals("publicarPrivado")){
                                String destino = request.getParameter("destino");
                                //sendRedirect(ruta + "/" + destino);
                                
                                 if(destino.equals("mensajes.jsp")){
                                    response.sendRedirect(ruta + "/MensajeServlet?opcion=muestraBandejaEntrada");
                                }else if(destino.equals("gente.jsp")){
                                    Paginacion p = new Paginacion(UsuarioGenerico.USUXPAG, UsuarioGenerico.cuentaUsuarios(usuario, "", 1), pagina);
                                    List<UsuarioGenerico> usuarios = UsuarioGenerico.getUsuariosGenericosPorNombre("", usuario, false, p.offset(), p.getRegistrosPorPagina());
                                    //usuarios = usuarioSesion.filtraUsuarioSesion(usuarios); 
                                    request.setAttribute("paginacionUsuarios", p);
                                    request.setAttribute("listaUsuarios", usuarios);
                                    request.getRequestDispatcher("/gente.jsp").forward(request, response);
                                }else{
                                    response.sendRedirect(ruta + "/" + destino);
                                }
                                 
                                 
                            }
                            
                        } else { //Si no ha ido bien, vamos al muro, pero con forward para mostrar el por qué
                            if(opcion.equals("publicarPost") || opcion.equals("publicarComentario")){
                                request.getRequestDispatcher("/muro.jsp").forward(request, response);
                            }else if(opcion.equals("publicarPrivado")){
                                String destino = request.getParameter("destino");
                                //Si hay errores los guardamos en la petición
                                request.getRequestDispatcher("/" + destino).forward(request, response);
                            }
                        }
                    }
                }
            }
            
        } catch (Exception e) {
            out.write("Error: " + e.getMessage());
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
